package main

import (
	"bilibili_converter/converter"
	"bytes"
	"encoding/json"
	"io/ioutil"
	"os"
	"path/filepath"
)

// doCreateTempDir 创建临时文件夹
func doCreateTempDir(tempDir string) {
	if file, e := os.Open(tempDir); e != nil {
		if !os.IsNotExist(e) {
			logger.Printf("打开临时文件夹失败:%s\n", e.Error())
			os.Exit(1)
		} else {
			logger.Printf("正在创建临时数据文件夹 temp\n")
			e = os.MkdirAll(tempDir, os.ModePerm)
			if e != nil {
				if !os.IsExist(e) {
					logger.Printf("创建临时数据文件夹 temp 失败：%s\n", e.Error())
					os.Exit(1)
				} else {
					doCreateTempDir(tempDir)
				}
			}
		}
	} else {
		defer file.Close()
		info, e := file.Stat()
		if e != nil {
			logger.Printf("临时数据文件夹 temp 获取信息失败：%s\n", e.Error())
			os.Exit(1)
		}
		if !info.IsDir() {
			logger.Printf("%s 不是一个文件夹\n", tempDir)
			os.Exit(2)
		}
	}
}

// parseSource 解析source文件夹，生成特定的数据格式返回
func parseSource(command *converter.Command) []*converter.CacheDirInfo {
	infos, e := ioutil.ReadDir(command.Source)
	if e != nil {
		logger.Printf("读取文件夹失败:%s", e.Error())
		os.Exit(2)
		return nil
	}
	cacheDirInfoSlice := make([]*converter.CacheDirInfo, 0, 1)
	if !command.Wrap {
		cacheDirInfoSlice = append(cacheDirInfoSlice,
			&converter.CacheDirInfo{RootPath: command.Source, FileInfos: infos})
	} else {
		for _, fileInfo := range infos {
			children := children(command, fileInfo)
			cacheDirInfoSlice = append(cacheDirInfoSlice,
				&converter.CacheDirInfo{RootPath: filepath.Join(command.Source, fileInfo.Name()), FileInfos: children})
		}
	}
	return cacheDirInfoSlice
}

// 如果是合集类型的source文件夹，那么读取他下面的子集
func children(command *converter.Command, fileInfo os.FileInfo) []os.FileInfo {
	if fileInfo.IsDir() {
		join := filepath.Join(command.Source, fileInfo.Name())
		infos, e := ioutil.ReadDir(join)
		if e != nil {
			logger.Printf("读取文件夹[%s]失败:%s", join, e.Error())
			return nil
		}
		return infos
	}
	return nil
}

// 读取Entry
func ReadEntry(entryPath string) *Entry {
	file, e := os.Open(entryPath)
	if e != nil {
		logger.Printf("读取 %s 错误:", e.Error())
		return nil
	}
	defer file.Close()
	var bytesBuffer bytes.Buffer
	buf := make([]byte, 1024)
	for {
		n, e := file.Read(buf)
		bytesBuffer.Write(buf[:n])
		if n == 0 || e != nil {
			break
		}
	}
	entry := new(Entry)
	e = json.Unmarshal(bytesBuffer.Bytes(), entry)
	if e != nil {
		logger.Printf("读取 %s 错误:", e.Error())
		return nil
	}
	return entry
}
